package com.itlong.cloud.property.service;

import com.itlong.cloud.POJO.DTO.property.*;
import com.itlong.cloud.POJO.VO.property.PropertyProjectUnitInfoVO;
import com.itlong.cloud.POJO.VO.property.PropertyProjectUnitSimpleInfoExVO;
import com.itlong.cloud.POJO.VO.property.PropertyProjectUnitSimpleInfoVO;
import com.itlong.cloud.utils.page.Page;

import java.util.List;


/**
 * <desc>
 *      单元信息处理接口.
 * </desc>
 *
 * @createDate 2017-09-22
 */
public interface IPropertyUnitInfoService {

    /**
     * <desc>
     *      保存单个单元信息
     * </desc>
     *
     * @param propertyProjectSaveUnitInfoDTO  添加单元信息数据传输对象
     * @return 受影响的行数
     * @author LouisLewis
     * @createDate 2017-09-26
     */
    Integer saveUnitInfo(PropertyProjectSaveUnitInfoDTO propertyProjectSaveUnitInfoDTO) throws Exception;


    /**
     * <desc>
     *      修改单元信息【根据单元Id（UnitId）】
     * </desc>
     *
     * @param propertyProjectUpdateUnitInfoDTO 修改单元信息数据传输对象
     * @return 受影响的行数
     * @author LouisLewis
     * @createDate 2017-09-30
     */
    Integer updateUnitInfo(PropertyProjectUpdateUnitInfoDTO propertyProjectUpdateUnitInfoDTO) throws Exception;

    /**
     * <desc>
     *      逻辑删除单元信息(支持按unitId或buildId进行删除）
     * </desc>
     *
     * @param propertyProjectRemoveUnitInfoDTO 删除单元信息数据传输对象
     * @return 受影响的行数
     * @author LouisLewis
     * @createDate 2017-09-27
     */
    Integer removeUnitInfo(PropertyProjectRemoveUnitInfoDTO propertyProjectRemoveUnitInfoDTO) throws Exception;

    /**
     * <desc>
     *      分页查询单元信息
     * </desc>
     *
     * @param propertyProjectGetUnitInfoDTO 分页查询单元信息数据传输对象
     * @return 分页查询结果对象
     * @author LouisLewis
     * @createDate 2017-09-28
     */
    Page<PropertyProjectUnitInfoVO> getPage(PropertyProjectGetUnitInfoDTO propertyProjectGetUnitInfoDTO) throws Exception;


    /**
     * <desc>
     *      获取指定楼栋下的单元简单信息（单元id ,单元名称）列表
     * </desc>
     *
     * @param propertyProjectGetUnitSimpleInfoDTO 查询单元简单信息（单元ID，单元名称）数据传输对象
     * @return 单元简单信息（单元id ,单元名称）列表
     * @author LewisLouis
     * @createDate 2017-09-30
     */
    Page<PropertyProjectUnitSimpleInfoVO> getPageUnitSimpleInfoList(
            PropertyProjectGetUnitSimpleInfoDTO propertyProjectGetUnitSimpleInfoDTO) throws  Exception;


    /**
     * <desc>
     *      分页查询指定楼栋下的单元简单扩展信息（单元id ,单元名称，房间数量）列表
     * </desc>
     *
     * @param propertyProjectGetUnitSimpleInfoDTO 查询单元简单信息（单元ID，单元名称）数据传输对象
     * @return 单元简单扩展信息（单元id ,单元名称）列表
     * @author LewisLouis
     * @createDate 2017-09-30
     */
    Page<PropertyProjectUnitSimpleInfoExVO> getPageUnitSimpleInfoExList(
            PropertyProjectGetUnitSimpleInfoDTO propertyProjectGetUnitSimpleInfoDTO) throws  Exception;

    /**
     * <desc>
     *      精确查询，获取单个单元信息
     * </desc>
     * @param propertyProjectGetUnitInfoDTO 查询单元信息数据传输对象
     * @return 按创建时间降序排列，首个符合查询条件的单元信息
     * @author LouisLewis
     * @createDate 2017-09-29
     */
    PropertyProjectUnitInfoVO getOneUnitInfo(PropertyProjectGetUnitInfoDTO propertyProjectGetUnitInfoDTO);

    /**
     * <desc>
     *      查询楼栋下的单元id集合
     * <desc/>
     * @param  buildIds 楼栋ID,多个以英文，分隔，如 11111111，22222222
     * @return  该楼栋下所有的单元ID集合
     * @author Biao.R
     * @createDate 2017/12/9
     */
    List<String> getUnitIdInBuildIds(String buildIds);


    /**
    * <desc>
    *    获取最小可用单元代号
    * </desc>
    *
    * @param getMinAvaliableUnitAliasDTO  获取最小可用单元代号的参考信息
    * @return 最小可用单元代号
    * @author LewisLouis
    * @createDate 2018-01-15
    */
    String getMinAvaliableUnitAlias(PropertyProjectGetMinAvaliableUnitAliasDTO getMinAvaliableUnitAliasDTO);



    /**
     * <desc>
     *      获取指定楼栋的最小可用单元编号(UnitNum).
     * </desc>
     *
     * @param buildId 指定楼栋Id
     * @return 最小可用单元编号(UnitNum).
     * @author LewisLouis
     * @createDate 2017-09-26
     */
    String getMinAvailableUnitNum(String buildId);

    /**
     * <desc>
     *      一次性接口，初始化所有单元组号
     * </desc>
     *
     * @throws Exception
     * @author wangzhi
     * @createDate 2018/08/21
     */
    void initializeUnitGroupNum() throws Exception;

    /**
     * <desc>
     *      获取最小可用单元组号
     * </desc>
     *
     * @param projectId 项目id
     * @return 单元组号
     * @author wangzhi
     * @createDate 2018/08/21
     */
    String getMinAvailableUnitGroupNum(String projectId) throws Exception;

    /**
     * <desc>
     *      获取项目动态密码验证方式
     * </desc>
     *
     * @param projectId 项目id
     * @return 项目动态密码验证方式
     * @author wangzhi
     * @createDate 2018/08/21
     */
    Integer getProjectOtpOnline(String projectId);
}
